﻿using UnityEngine;
using System.Collections;


public class Bomb : MonoBehaviour
{
    public float bombRadius = 10f;            // 炸弹的爆炸半径（范围内敌人会被消灭）
    public float bombForce = 100f;            // 敌人被爆炸抛出的力度
    public AudioClip boom;                    // 爆炸音效
    public AudioClip fuse;                    // 炸弹引信音效
    public float fuseTime = 1.5f;             // 引信燃烧时间
    public GameObject explosion;             // 爆炸效果的预制体
    public GameObject explosionFXPrefab;     // 粒子系统的预制体

    public float PlayerDamage = 30;            //对玩家造成的伤害

    private LayBombs layBombs;                // 引用玩家的 LayBombs 脚本
    private PickupSpawner pickupSpawner;      // 引用 PickupSpawner 脚本（用于生成拾取物）
    //private ParticleSystem explosionFX;       // 爆炸特效的粒子系统引用

    void Awake()
    {
        // 设置引用
        //explosionFX = GameObject.FindGameObjectWithTag("ExplosionFX").GetComponent<ParticleSystem>();//需要在场景中放置一个
        pickupSpawner = GameObject.Find("pickupManager").GetComponent<PickupSpawner>();
        if (GameObject.FindGameObjectWithTag("Player"))
            layBombs = GameObject.FindGameObjectWithTag("Player").GetComponent<LayBombs>();
    }

    void Start()
    {
        // 如果炸弹没有父物体，说明是玩家放置的，需要引爆
        if (transform.root == transform)
            StartCoroutine(BombDetonation());
    }

    IEnumerator BombDetonation()
    {
        // 播放引信音效
        AudioSource.PlayClipAtPoint(fuse, transform.position);

        // 等待引信时间
        yield return new WaitForSeconds(fuseTime);

        // 引爆炸弹
        Explode();
    }

    public void Explode()
    {
        // 允许玩家再次放置炸弹（如果有炸弹库存）
        layBombs.bombLaid = false;

        // 通知拾取物生成器生成新的拾取物
        pickupSpawner.StartCoroutine(pickupSpawner.DeliverPickup());

        // 找到爆炸半径内所有"Enemies"层上的碰撞体
        Collider2D[] enemies = Physics2D.OverlapCircleAll(transform.position, bombRadius, 1 << LayerMask.NameToLayer("Enemy"));

        // 对每个碰撞体...
        foreach (Collider2D en in enemies)
        {
            // 检查是否有刚体（每个敌人只有一个刚体，在父物体上）
            Rigidbody2D rb = en.GetComponent<Rigidbody2D>();
            if (rb != null && rb.tag == "Enemy")
            {
                // 找到敌人脚本并将其生命值设为0
                rb.gameObject.GetComponent<Enemy>().HP = 0;

                // 计算炸弹到敌人的向量
                Vector3 deltaPos = rb.transform.position - transform.position;

                // 在这个方向上施加一个力，力度为bombForce
                Vector3 force = deltaPos.normalized * bombForce;
                rb.AddForce(force);
            }
        }

        // 检测炸弹爆炸范围内的所有 "Player" 层碰撞体
        Collider2D[] players = Physics2D.OverlapCircleAll(
            transform.position, // 炸弹位置
            bombRadius,         // 爆炸半径
            1 << LayerMask.NameToLayer("Player") // 只检测 "Player" 层
        );

        // 遍历所有检测到的玩家
        foreach (Collider2D playerCollider in players)
        {      
            PlayerHealth playerHealth = playerCollider.GetComponent<PlayerHealth>();// 获取玩家的 Health 组件

            if (playerHealth != null)// 如果玩家有 Health 组件，调用 PlayerHurt 方法
            {
               
                float damage = CalculateDamage(playerCollider.transform.position); // 计算伤害，基于距离计算

               
                //playerHealth.PlayerHurt(damage); // 调用 PlayerHurt   
                playerHealth.PlayerHurt(transform.position, damage);// 击退效果版
            }
        }

        // 设置爆炸特效的位置并播放粒子系统
        //explosionFX.transform.position = transform.position;
        //explosionFX.Play();
        // 实例化爆炸特效预制体并播放
        if (explosionFXPrefab != null)
        {
            GameObject fxInstance = Instantiate(explosionFXPrefab, transform.position, Quaternion.identity);
            ParticleSystem fxParticles = fxInstance.GetComponent<ParticleSystem>();
            fxParticles.Play();

            // 如果预制体上有粒子系统，等待播放完成
            if (fxParticles != null)
            {
                // 计算粒子系统的总持续时间
                float totalDuration = fxParticles.main.duration + fxParticles.main.startLifetime.constantMax;
                Destroy(fxInstance, totalDuration); // 播放完成后销毁
            }
            else
            {
                // 如果没有粒子系统，1秒后销毁
                Destroy(fxInstance, 1f);
            }
        }

        // 实例化爆炸预制体
        Instantiate(explosion, transform.position, Quaternion.identity);

        // 播放爆炸音效
        AudioSource.PlayClipAtPoint(boom, transform.position);

        // 销毁炸弹
        Destroy(gameObject);
    }
    float CalculateDamage(Vector3 playerPosition)
    {
        float distance = Vector3.Distance(transform.position, playerPosition);
        float normalizedDistance = Mathf.Clamp01(distance / bombRadius); // 归一化到 [0, 1]
        float damage = Mathf.Lerp(PlayerDamage, 0, normalizedDistance); // 线性插值计算伤害
        return damage;
    }

}